package com.cjj.controller;

import cn.hutool.core.io.FileUtil;
import com.cjj.common.convention.exception.ServiceException;
import com.cjj.common.convention.result.Result;
import com.cjj.common.convention.result.Results;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

@RestController
@RequestMapping("/api/image")
@CrossOrigin(origins = "*") // 允许跨域访问
public class ImageController {
    //问题：上传文件或者下载文件的源头：文件从哪里上传到哪里去 文件从哪里下载到哪里去
    //文件上传的位置暂时定于当前项目的根目录：System.getProperty("user.dir") 获取当前项目的根目录
    //定义文件上传的位置:文件上传目录的路径
    private static final String filepath = System.getProperty("user.dir") + "/files/";

    /**
     * 文件上传
     */
    @PostMapping("/upload")
    public Result<String> upload(MultipartFile file) {
        //文件是上传的核心要素：文件名 目标路径 文件存储名
        //MultipartFile 用于接受前端发来的请求文件，以文件的流的形式接受前端发来的文件

        //1、获取目标文件的源文件名
        String originalFilename = file.getOriginalFilename(); //如1.png

        //2、判断文件要上传的位置路径是否存在 不存在就创建
        if (FileUtil.isDirectory(filepath)) {
            FileUtil.mkdir(filepath);
        }
        System.out.println(filepath);

        //3、给文件设置一个唯一的标识 12314515_xxx.png  其中 System.currentTimeMillis() 获取当前时间的时间戳
        String fileName = System.currentTimeMillis() + "_" + originalFilename;

        //4、文件从属的完整路径
        String realPath = filepath + fileName;

        //5、上传文件到目标路径 写文件
        try {

            FileUtil.writeBytes(file.getBytes(), realPath);//以字节流的形式写文件

        } catch (IOException e) {
            throw new ServiceException("文件上传失败");
        }

        //返回以后网络链接： http://localhost:8080/files/xxx.png

        String url = "http://localhost:8080/files/" + fileName;

        return Results.success(url);
    }


    /**
     * 文件下载
     **/

    @GetMapping("/download/{fileName}")
    public void download(@PathVariable String fileName, HttpServletResponse response) {
        try {
            //使用浏览器发送请求来下载文件时，需要设置文件的编码格式以及文件头的设置
            response.addHeader("Content-Disposition", "attachment;filename" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));//w文件地址和编码方式
            response.setContentType("application/actet-stream");
            OutputStream os = response.getOutputStream();//输出流 通过浏览器的对象获取输出流
            //1、获取要下载文件的完整路径
            String realPath = filepath + fileName;

            //2、获取以字节形式到文件的字节数组
            byte[] bytes = FileUtil.readBytes(realPath);

            //3、将读取到的文件存储（写入）到目标文件

            os.write(bytes);
            os.flush();
            os.close();
        } catch (IOException e) {
            throw new ServiceException("文件下载失败");
        }
    }
}